home *** CD-ROM | disk | FTP | other *** search
/ The Original Shareware 1.1 / The Original Shareware (WeMake CDs)(Volume 1.1)(CDs, Inc)(1993).iso / 22 / dumphp.zip / DUMPHP.ASM next >
Assembly Source File  |  1986-10-02  |  6KB  |  191 lines

  1.         TITLE    DUMP HP
  2.  
  3. ; Dumps graphics on the HP LaserJet
  4.  
  5. PRINT    MACRO    MESSAGE        ;PRINT A MESSAGE ON THE PRINTER
  6.     LOCAL    BACK,DONE
  7.         PUSH    AX
  8.     LEA    SI,MESSAGE
  9. BACK:   LODSB
  10.         CMP    AL,'$'        ;STRING TERMINATER
  11.         JE    DONE
  12.         MOV    DX,0
  13.         MOV    AH,1
  14.         INT    14H
  15.         JMP    BACK
  16. DONE:
  17.     POP    AX
  18.     ENDM
  19.  
  20. INTERRUPTS      SEGMENT AT 0H   ;THIS IS WHERE THE SCREEN_DUMP INTERRUPT
  21.         ORG     5H*4            ;IS LOCATED
  22. SCREEN_DUMP_INT    LABEL   DWORD  
  23. INTERRUPTS      ENDS
  24.  
  25. CODESEG        SEGMENT
  26.         ASSUME  CS:CODESEG
  27.         ORG     100H            ;ORG = 100H TO MAKE THIS INTO A .COM FILE
  28. FIRST:  JMP     INIT        ;FIRST TIME THROUGH JUMP TO INITIALIZE ROUTINE
  29.  
  30. PRTSC   PROC    NEAR            ;THE SCREEN_DUMP INTERRUPT WILL NOW COME HERE.
  31.         ASSUME  CS:CODESEG
  32.         PUSH    AX              ;SAVE THE USED REGISTERS FOR GOOD FORM
  33.         PUSH    BX
  34.         PUSH    CX
  35.         PUSH    DX
  36.         PUSH    DI
  37.         PUSH    SI
  38.         PUSH    DS
  39.         PUSH    ES
  40.  
  41.     JMP    OVER     ;JUMP OVER DATA
  42.  
  43. ;---------------------------------------------------------------
  44.  
  45. OLD_PRTSC_INT    DD    ?    ;OLD DUMP ROUTINE
  46. DOWN    DB    0        ;DISTANCE DOWN
  47. XXX    DW    0        ;CURRENT SCAN LINE
  48.  
  49. SETUP    DB    27,'*t100R'    ;100 DPI GRAPHICS MODE
  50.     DB    27,'*r2A'    ;START RASTER GRAPHICS
  51.         DB    '$'
  52. READY    DB    27,'&a+1V'    ;MOVE DOWN 1 DECIPOINT
  53.     DB    27,'*b80W'    ;GET READY FOR 80 BYTES
  54.         DB    '$'
  55. ENDG    DB    27,'*rB'    ;END RASTER GRAPHICS
  56.     DB    '$'
  57. ;---------------------------------------------------------------
  58.  
  59. OVER:        ASSUME    DS:CODESEG,ES:NOTHING
  60.         MOV    AX,0B800H    ;FIX EXTRA SEGMENT REISTER
  61.             MOV    ES,AX        ;TO POINT TO GRAPHICS SCREEN
  62.                 MOV    AX,CS        ;FIX DATA SEGMENT REGISTER
  63.                 MOV    DS,AX        ;TO POINT TO CODE SEGMENT
  64.  
  65.         MOV    AH,0FH        ;READ VIDEO MODE
  66.             INT    10H
  67.             CMP    AL,7        ;MONOCHROME?
  68.             JE    OLD_DUMP    ;YES -- USE OLD SCREEN DUMP ROUTINE
  69.             CMP    AL,3        ;TEXT MODE?
  70.             JG    START        ;NO -- USE NEW SCREEN DUMP ROUTINE
  71.  
  72. OLD_DUMP:    PUSHF            ;SAVE THE FLAGS
  73.         CALL    OLD_PRTSC_INT    ;CALL OLD ROUTINE
  74.                 JMP    OUT         ;RETURN TO CALLER
  75.  
  76. ;----- IF WE ARE HERE, WE MUST BE IN GRAPHICS MODE -----;
  77.  
  78. START:        PRINT    SETUP        ;SETUP PRINTER
  79.         MOV    DOWN,0        ;START AT 0 DOWN
  80.                 MOV    XXX,0        ;COLUMN NUMBER
  81. NEXTROW:        MOV    CX,3        ;PRINT EACH ROW THREE TIMES
  82. ITERATION1:     PRINT    READY        ;READY GRAPHICS
  83.  
  84.                MOV    DI,XXX        ;GET STARTING LOCATION
  85.                 PUSH    CX        ;SAVE CX
  86.                 MOV    CX,80        ;DO THIS 80 TIMES
  87. LOOP1:        MOV    AL,ES:[DI]    ;READ BYTE INTO DL
  88.         MOV    DX,0        ;PRINT BYTE
  89.                 MOV    AH,1
  90.                 INT    14H
  91. ELOOP1:        INC    DI        ;GET NEXT BYTE
  92.         LOOP    LOOP1
  93.                 POP    CX        ;GET CX BACK
  94.                 PRINT    ENDG        ;END RASTER GRAPHICS
  95.                 LOOP    ITERATION1    ;DO THIS THREE TIMES
  96.  
  97.         MOV    CX,80        ;REVERSE 80 BYTES
  98.                 MOV    DI,XXX        ;GET LOCATION
  99. RLOOP1:        MOV    AL,ES:[DI]    ;READ BYTE
  100.         XOR    AL,11111111B    ;REVERSE BYTE
  101.                 MOV    ES:[DI],AL    ;WRITE IT
  102.                 INC    DI        ;GET NEXT LOCATION
  103.                 LOOP    RLOOP1
  104.  
  105.                 MOV    CX,3        ;DO THREE TIMES
  106. ITERATION2:     PRINT    READY        ;READY GRAPHICS
  107.                MOV    DI,XXX        ;GET STARTING LOCATION
  108.                 ADD    DI,8192        ;DO NEXT ROW
  109.                 PUSH    CX        ;SAVE CX
  110.  
  111.                 MOV    CX,80        ;DO THIS 80 TIMES
  112. LOOP2:        MOV    AL,ES:[DI]    ;READ BYTE INTO DL
  113.         MOV    DX,0        ;PRINT BYTE
  114.                 MOV    AH,1
  115.                 INT    14H
  116. ELOOP2:        INC    DI        ;GET NEXT BYTE
  117.         LOOP    LOOP2
  118.                 POP    CX        ;GET CX BACK
  119.                 PRINT    ENDG
  120.                 LOOP    ITERATION2    ;DO IT AGAIN
  121.  
  122.         MOV    CX,80        ;REVERSE 80 BYTES
  123.                 MOV    DI,XXX        ;GET LOCATION
  124.                 ADD    DI,8192        ;UPDATE IT
  125. RLOOP2:        MOV    AL,ES:[DI]    ;READ BYTE
  126.         XOR    AL,11111111B    ;REVERSE BYTE
  127.                 MOV    ES:[DI],AL    ;WRITE IT
  128.                 INC    DI        ;GET NEXT LOCATION
  129.                 LOOP    RLOOP2
  130.  
  131.         ADD    XXX,80        ;MOVE DOWN TO NEXT SCAN LINE
  132.                 INC    DOWN        ;INCREMENT DOWN COUNTER
  133.                 CMP    DOWN,100
  134.                 JGE    RESET        ;DONE -- RESET SCREEN
  135.                 LEA    AX,NEXTROW    ;DO NEXT ROW
  136.                 JMP    AX
  137.  
  138. RESET:        MOV    CX,03FFFH    ;RE-REVERSE SCREEN
  139.         XOR    DI,DI        ;START AT 0
  140. LOOP3:        MOV    AL,ES:[DI]    ;GET BYTE
  141.         XOR    AL,11111111B    ;REVERSE IT
  142.                 MOV    ES:[DI],AL    ;WRITE IT
  143.                 INC    DI
  144.                 LOOP    LOOP3        ;GET NEXT
  145.  
  146. OUT:        POP    ES        ;POP FLAGS FROM STACK
  147.         POP    DS
  148.             POP    SI
  149.             POP    DI
  150.             POP    DX
  151.             POP    CX
  152.             POP    BX
  153.             POP    AX
  154.             IRET                ;RETURN TO CALLER
  155. PRTSC       ENDP
  156.  
  157. INIT        PROC    NEAR    ;THIS PROCEDURE INTIALIZES EVERYTHING
  158.     JMP    HERE        ;JUMP OVER DATA
  159.  
  160. MSG1:    DB    13,10
  161.     DB    'DUMP GRAPHICS ONTO THE HP LASERJET PRINTER',13,10
  162.         DB    '              by Scott Pakin',13,10,10
  163.         DB    'Press <shift> <PrtSc> to dump the graphics screen.',13,10
  164.         DB    'Text modes will print using the regular screen dump routine.'
  165.         DB    13,10
  166.         DB    '$'
  167.  
  168. HERE:    LEA    DX,MSG1        ;PRINT INITIAL MESSAGE
  169.         MOV    AH,9
  170.         INT    21H
  171.  
  172.         ASSUME  DS:INTERRUPTS   ;THE DATA SEGMENT WILL BE THE INTERRUPT AREA
  173.         MOV     AX,INTERRUPTS
  174.         MOV     DS,AX
  175.         
  176.         MOV    AX,SCREEN_DUMP_INT        ;STORE OLD LOCATION
  177.         MOV    OLD_PRTSC_INT,AX
  178.         MOV    AX,SCREEN_DUMP_INT[2]
  179.         MOV    OLD_PRTSC_INT[2],AX
  180.  
  181.         MOV     SCREEN_DUMP_INT,OFFSET PRTSC  ;NOW LOAD THE ADDRESS OF OUR NOTEPAD
  182.         MOV     SCREEN_DUMP_INT[2],CS         ;ROUTINE INTO THE SCREEN_DUMP INTERRUPT
  183.                                         
  184. EXIT:   MOV     DX,OFFSET INIT          ;SET UP EVERYTHING BUT INIT TO
  185.         INT     27H                     ;STAY AND ATTACH ITSELF TO DOS
  186. INIT        ENDP
  187.  
  188.         CODESEG        ENDS
  189.         
  190.         END     FIRST            ;END "FIRST" SO 8088 WILL GO TO FIRST FIRST.
  191.